Особенности работы системы при гранулярном управлении доступом
------------------------------------------------------------------------------

Особенности работы привилегий
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. include:: tables/t.1.md
   :parser: myst_parser.sphinx_

Особенности работы методов PUT и PATCH
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

При работе этих методов могут не возвращаться ошибки об отсутствии прав на выполнение операций на изменение сущностей.

При методах PUT и PATCH работает следующим образом:

1. выполняется метод GET, который возвращает сущность в текущем состоянии;
2. выполняется метод PUT или PATCH, который меняет сущность;
3. выполняется метод GET, который возвращает измененную сущность.

Если отправлять PUT или PATCH запрос с телом запроса без изменения сущности, выполняется 1-й шаг - метод GET, который возвращает сущность в текущем состоянии, а метод PUT (2-й шаг) не будет выполняться, так как запись не меняется.

В этом случае пользователю без прав на изменение сущности (методами PUT или PATCH) системой не будет выдана ошибка об отсутствии прав на операцию, т.к. эта операция не выполнялась.

Если отправить PUT или PATCH запрос с изменением от пользователя, не имеющем на это права, тогда валидация прав корректно отработает.

Возможные ответы системы на запросы GET при отсутствии прав на выполнение операции
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

При отсутствии прав на запросы GET система может выдавать следующие варианты ответов:

- сообщение об ошибке на выполнение операции из-за отсутствия прав:

.. code-block:: 

    // {
        "error": "Отсутствуют права на выполнение данной операции",
        "success": false,
        "code": "ForbiddenError"
    }

.. code-block:: 

    // {
        "error": "Отсутствуют права на выполнение данной операции",
        "success": false,
        "code": "DeniedIPAError"
    }

- успех операции с пустыми списками, для которых указано ненулевое количество записей:

.. code-block:: 

    // {    "data": [],    "total": 45,    "success": true}

- успех операции с пустыми списками, для которых возвращается ноль записей:

.. code-block:: 

    // {    "data": [],    "total": 0,    "success": true}